<?php defined('BASEPATH') OR exit('No direct script access allowed');

class Login extends CI_Controller {

	/* Layout utilizado pela pagina. */
	public $layout = 'default_login';
	
	/* Titulo da Pagina. */
	public $title = CLIENTE;
	
	/* css utilizado pela pagina. */
	public $css = array('admin/bootstrap', 'admin/animate', 'admin/style', 'plugins/waitMe/waitMe' );
	
	/* Js utilizado pela pagina. */
	public $js = array('plugins/jquery/jquery-2.1.4', 'admin/bootstrap', 'plugins/waitMe/waitMe');
	
	public function __construct()
	{
		parent::__construct();
		$this->load->model('Usuario_Model', 'usuario');
		$this->load->model('Senha_Model', 'senha');	
		$this->load->model('Config_Email_Model', 'config_email');
		
		include_once 'app/enum/EnumTipoSenha.php';
	}
	
	public function index()
	{					
		try {
				
			$logged = $this->session->userdata('logged');
			
			if (empty($logged) || $logged != true) {
				
				//Carregando js e css
				array_push($this->js, 'plugins/formValidation/formValidation', 'plugins/framework/bootstrap', 'admin/login');
				array_push($this->css, 'plugins/formValidation/formValidation');
				
				$this->load->view('admin/login');
			} else{
				redirect("home");
			}					
			
		}catch (Exception $e){
			echo ($e->getMessage());
		}
		
	}
	
	public function efetuarLogin(){
		try {
			
			$this->layout = "";
			
			$retornoJson = false;
			$tipoMensagem = "";
			$mensagem = "";
			
			//Pegando dados do form
			$login = trim($this->input->post('usuario'));
			$senha = trim($this->input->post('senha'));
					
			$retorno = $this->usuario->validaUsarioLogin($login, md5($senha));	

			//Iniciando transação
			$this->db->trans_begin();
			
			if (!empty($retorno)){
				
				//Ip da pessoa logada
				$data = array(
					'ip' => $_SERVER['REMOTE_ADDR'],
					'logged' => 'T',
					'dtUltimoAcesso' => date("Y-m-d H:i:s"),
				);
				
				//atualizando dados
				if($this->usuario->alterar($data, $retorno->idUsuario)){
					$retornoJson =  true;
					$tipoMensagem = "alert-success";
					$mensagem = "Login efetuado com sucesso";
				}
								
			}else{	
				throw new Exception('Usuário e/ou Senha inválidos!');
			}
			
			if ($retornoJson){
				$this->db->trans_commit();
			}else{
				$this->db->trans_rollback();
			}
			
			$json = null;
			$json['sucesso'] = $retornoJson;
			
			if ($retornoJson){
				if ((int)$retorno->tipoSenha === (int)EnumTipoSenha::getCodigo(EnumTipoSenha::ESQUECEU_SENHA)){
					$json['redirect'] = true;
				}else{
					$json['redirect'] = false;
				}
			}
			
			$json['tipoMensagem'] = $tipoMensagem;
			$json['mensagem'] = $mensagem;
			
			echo json_encode($json);
			
		}catch (Exception $e){
			$this->db->trans_rollback();
			
			$json['sucesso'] = false;
			$json['tipoMensagem'] = "alert-danger";
			$json['mensagem'] = $e->getMessage();
			
			echo json_encode($json);
		}
		
	}
	
	public function logout(){
		
		try {
			
			$this->layout = "";
			
			$retornoJson = false;
			
			$idUsuario = decrypt(trim($this->session->userdata('idUsuario')));
			
			//Iniciando transação
			$this->db->trans_begin();
			
			$usuario = null;
			$usuario['logged'] = 'F';
			
			//atualizando dados
			if($this->usuario->alterar($usuario, $idUsuario)){
				$retornoJson =  true;
			}else{
				$retornoJson = false;
			}
			
			if ($retornoJson){
				$this->db->trans_commit();
			}else{
				$this->db->trans_rollback();
			}
			
			//Linpando a session
			$this->session->sess_destroy();
			
			redirect("admin");
				
		}catch (Exception $e){
			$this->db->trans_rollback();
			echo ($e->getMessage());
		}
		
	}
	
	public function recuperarSenha() {
		try {
			
			$this->layout = "";
			
			$retornoJson = false;
			$tipoMensagem = "";
			$mensagem = "";
			
			$email = trim ( $this->input->post ( 'email' ) );
			
			$retorno = $this->usuario->validaEmailCadastrado ( $email );
			
			//Iniciando transação
			$this->db->trans_begin();
			
			if (! empty ( $retorno )) {
				
				//Inativando a senha antiga
				$registroAntigo = null;
				$registroAntigo['dtVigenciaFim'] = date("Y-m-d H:i:s");

				if ($this->senha->alterar($registroAntigo, $retorno[0]->idSenha)){
										
					//Gera nova senha aleatória
					$senha = $this->geraSenhaAleatoria();
					
					$registroNovo = null;
					$registroNovo['idUsuario'] = $retorno[0]->idUsuario;
					$registroNovo['senha'] = md5 ( trim($senha) );
					$registroNovo['dtVigenciaIni'] = date("Y-m-d H:i:s");
					$registroNovo['dtVigenciaFim'] = null;
					$registroNovo['tipoSenha'] = EnumTipoSenha::getCodigo(EnumTipoSenha::ESQUECEU_SENHA);
					
					$idSenhaNova = $this->senha->inserir( $registroNovo );
					
					if (!empty($idSenhaNova) && $idSenhaNova != false) {
						if ($this->enviaEmail ( $email, $senha, $retorno[0]->login )) {
							// Email enviado com sucesso
							$mensagem = "Email enviado com sucesso!";
							$tipoMensagem = "alert-success";
							$retornoJson = true;
						} else {
							// Erro ao enviar o email
							throw new Exception('Erro ao enviar o email!');
						}
					} 
				}
				
			} else {
				// Não existe o email cadastrado.
				throw new Exception('Email não cadastrado!');
			}
			
			if ($retornoJson){
				$this->db->trans_commit();
			}else{
				$this->db->trans_rollback();
			}
			
			$json = null;
			$json['sucesso'] = $retornoJson;
			$json['tipoMensagem'] = $tipoMensagem;
			$json['mensagem'] = $mensagem;
			
			echo json_encode($json);
			
		} catch ( Exception $e ) {
			$this->db->trans_rollback();
			
			$json['sucesso'] = false;
			$json['tipoMensagem'] = "alert-danger";
			$json['mensagem'] = $e->getMessage();
			
			echo json_encode($json);
		}
	}
	
	private function geraSenhaAleatoria() {
		try {
			
			// Caracteres de cada tipo
			$caracteres = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%*-';
			$senhaNova = "";
			
			$len = strlen ( $caracteres );
			
			for($n = 1; $n <= 10; $n ++) {
				$rand = mt_rand ( 1, $len );
				$senhaNova .= $caracteres [$rand - 1];
			}
			
			return $senhaNova;
			
		} catch ( Exception $e ) {
			throw $e;
		}
	}
	
	// Envio de email codegninter
	private function enviaEmail($email, $senha, $login) {
		try {
			
			$retorno = 0;
			
			$configEmail = $this->config_email->obter();
			
			if (!empty($configEmail)){
				$config = Array (
						'protocol' => $configEmail->protocol,
						'smtp_host' => $configEmail->smtpHost,
						'smtp_port' => $configEmail->smtpPort,
						'smtp_user' => $configEmail->smtpUser,
						'smtp_pass' => $configEmail->smtpPass,
						'smtp_timeout' => $configEmail->smtpTimeout,
						'mailtype' => $configEmail->mailtype,
						'charset' => $configEmail->charset
				);
				
				$this->load->library ( 'email', $config );
				$this->email->set_newline ( "\r\n" );
				
				$this->email->from ( $configEmail->fromEmail, $configEmail->fromDescricao );
				$this->email->to ( $email );
				
				$assunto = "Recuperaçâo de Senha - Valt Soluções em TI";
				$this->email->subject ( $assunto );
				
				$corpo = '<div style="width: 900px">
							<div>
								<div>
									<img src="' . base_url () . 'www/images/email/head_email.png">
								</div>
							</div>
							<div style="margin-top: 25px; margin-bottom: 25px; font-size: 15px;">
								  Sua senha provisória para acessar ao Valt Soluções em TI foi alterada com sucesso!<br><br>
	
								  <span style="font-weight: bold;">Login:</span> ' . $login . '<br>
							 	  <span style="font-weight: bold;">Senha:</span> ' . $senha . '<br><br>
							 	  		
							 	  <a href="http://localhost/valt/admin" target="_blank">Valt Soluções em TI</a>
							 	  		
							</div>
						 	<div>
								<div>
									<img src="' . base_url () . 'www/images/email/footer_email.png">
								</div>
							</div>
						  </div>';
				
				$this->email->message ( $corpo );
				
				$retorno = $this->email->send (FALSE);
				
			}
			
			if ((int)$retorno === 1) {
				return true;
			} else {
				return false;
				//echo $this->email->print_debugger();
			}
		} catch ( Exception $e ) {
			throw $e;
		}
	}
	
}